Function 類型寫法
(參數類型)-> 回傳值
func min(a: Int, b: Int) -> Int
=>(Int, Int) -> Int
func constains(Element) -> Bool
=>(Element) -> Bool
func isEqual(to: Double) -> Bool
=>(Double) -> Bool
什麼是 Closure
- 一段可以被傳遞的 code。
- Closure 可以被分成三種。
Closure 類型寫法
(參數類型) -> 回傳值
- Closure 可以被預設為參數類型,可以被當引數傳遞,也可以被當作回傳類型。
- 這個類型的寫法其實代表的是「Closure」。
Closure 表達式
{ (a: Int, b: Int)->Int in
a < b ? a : b
}
- in 表示宣告類型結束。
- 參數不能有預設值。
- 沒有引數名稱,使用 closure 時一律直接寫值。
- 因為沒有引數名稱,如果類型是「可以接受多個引數」的(T...),在後面不能再放其他參數。
Closure 用處
let minClosure = {(a: Int, b: Int, c: Int...)->Int in
a < b ? a : b
}
minClosure(2,5)
- closure 語法可以被存在變數裡。
- 主要是用在設定引數時,直接寫簡短的 closure 語法。
.sorted(by:)
func sorted(by: (Elment, Element)->Bool)->[Element]
假如第一個值應該被排在前面就回傳 true。
簡短寫法:自動簡稱
array.sorted(by:{a, b in a.身高 < b.身高})
- 假如沒有設定參數名稱,Swift 會自動根據參數位置順序產生簡稱。
- 第一個參數是$0、第二個$1......。
array.sorted(by:{ $0.身高 < $1.身高})
- 只能在沒有明確設定任何參數名稱時用。
- 不能跨 Closure 使用。
簡短寫法:結尾 Closure
array.sorted(by:{ $0.身高 < $1.身高 })
- 如果最後一個參數是 closure,可以把整個{}拉到()外面,並省略引數名稱。
array.sorted() { $0.身高 < $1.身高 }
- 如果拉出去之後沒有其他參數,括號可以省略。
array.sorted { $0.身高 < $1.身高 }
簡短寫法:Operator
[1,2,3,4].sorted(by: >)
- 直接輸入 Operator 的話,swift 會自動去找對應的 Operator,如果類型跟 Closure 的要求一樣就會直接套用,反之就會報錯。
func sorted(by: (Element, Element) -> Bool) -> [Element]
static func > (Self, Self) -> Bool
- Function 跟 Closure 的差別是什麼?
=> Function 是 Closure 的其中一種。
- 什麼時候可以不用寫 Closure 的參數類型和回傳類型?
=> 當 swift 可以判斷類型的時候,像是作為引數的時候。
- $0、$1 代表什麼?可以使用的範圍限制是哪裡?
=> Closure 中參數的簡稱,當沒有明確提供參數名稱時,swift 會自動按照順序給予這些簡稱。不能跨不同 Closure 使用。
影片連結:https://youtu.be/J2p8eYN0QSM?si=KdJHlxOJ_4PsPM7o